home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / C Internet Config / IC Application Source ƒ / 68k Internet Config ƒ / C Source ƒ / IC Document.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-06  |  9.1 KB  |  473 lines  |  [TEXT/SPM ]

  1. /*
  2.     IC Document.c
  3.     
  4. */
  5.  
  6. #include <Aliases.h>
  7. #include <Folders.h>
  8. #include <MixedMode.h>
  9.  
  10. #include "IC Types.h"
  11. #include "IC StrH.h"
  12. #include "IC API.h"
  13. #include "IC Keys.h"
  14. #include "IC Globals.h"
  15. #include "IC Misc Subs.h"
  16. #include "IC Subs.h"
  17. #include "IC Dialogs.h"
  18. #include "IC Window Globals.h"
  19. #include "IC Windows.h"
  20. #include "IC StandardFile.h"
  21.  
  22. #include "IC Document.h"
  23.  
  24. ICInstance instance;
  25. FSSpec current_file;
  26. long current_seed;
  27. FSSpec scratch_file; // open if name is not empty
  28. Boolean new_document,dirty_document,locked_document;
  29.  
  30. OSErr CopyFileSafe(FSSpec* source,FSSpec* dest){
  31.     FSSpec temp;
  32.     OSErr err;
  33.     short count;
  34.     Str31 st;
  35.     
  36.     BlockMoveData(dest,&temp,sizeof(FSSpec));
  37.     count=0;
  38.     
  39.     do {
  40.         SetPString(temp.name,2,"\pInternet Config Temp ",DecStr(count++,st));
  41.         err=HCreate(temp.vRefNum,temp.parID,temp.name,ICcreator,ICfiletype);
  42.     } while (err==dupFNErr);
  43.     if (err==noErr){
  44.         err=CopyFile(source,&temp);
  45.         if (err==noErr){
  46.             HDelete(dest->vRefNum,dest->parID,dest->name);
  47.             err=HRename(dest->vRefNum,dest->parID,temp.name,dest->name);
  48.         }
  49.     }
  50.     return err;
  51. }
  52.  
  53. ICInstance GetInstance(void){
  54.     return instance;
  55. }
  56.  
  57. Boolean IsDocOpen(void){
  58.     return (scratch_file.name[0]>0);
  59. }
  60.  
  61. Boolean IsDocDirty(void){
  62.     return IsDocOpen()&&dirty_document;
  63. }
  64.  
  65. Boolean IsDocNew(void){
  66.     return IsDocOpen()&&new_document;
  67. }
  68.  
  69. void DirtyDocument(void){
  70.     dirty_document=true;
  71. }
  72.  
  73. Boolean IsDocLocked(void){
  74.     return IsDocOpen()&&locked_document;
  75. }
  76.  
  77. StringPtr GetDocumentName(StringPtr name){
  78.     if (current_file.name[0]==0)
  79.         return GetAString(name,128,1);
  80.     else
  81.         return SetPString(name,1,current_file.name);
  82. }
  83.  
  84. Boolean PrefExists(const StringPtr key){
  85.     ICAttr attr;
  86.     long count;
  87.     
  88.     return ICMapErr(ICGetPref(instance,key,&attr,(Ptr)0,&count))==noErr;
  89. }
  90.  
  91. void SetPrefHandle(const StringPtr key,Handle h){
  92.     if (!PrefExists(key))
  93.         ICSetPrefHandle(instance,key,ICattr_no_change,h);
  94. }
  95.  
  96. void SetPrefStr(const StringPtr key,const StringPtr data){
  97.     if (!PrefExists(key))
  98.         ICSetPrefStr(instance,key,ICattr_no_change,data);
  99. }
  100.  
  101. void CheckServerPref(const StringPtr key){
  102.     Handle tmph;
  103.     OSErr err;
  104.     ICAttr junk;
  105.     Str255 t,t2;
  106.     
  107.     if (!PrefExists((const StringPtr)SetPString(t,2,key,"\pPreferred"))){
  108.         err=ICMapErr(ICGetPrefHandle(instance,(const StringPtr)SetPString(t,2,key,"\pAll"),&junk,&tmph));
  109.         if ((err==noErr)&&(tmph!=(Handle)0)&&(GetHandleSize(tmph)>2))
  110.             SetPrefStr((const StringPtr)SetPString(t,2,key,"\pPreferred"),
  111.                     (const StringPtr)GetIndStrH(tmph,1,t2));
  112.         if (tmph!=(Handle)0)
  113.             DisposeHandle(tmph);
  114.     }
  115. }
  116.  
  117. void AddDefaultPrefs(void){
  118.     short i,c;
  119.     Handle data;
  120.     short junk_id;
  121.     ResType junk_type;
  122.     Str255 name;
  123.     
  124.     UseResFile(app_resfile);
  125.     c=Count1Resources('Pref');
  126.     
  127.     for (i=1;i<=c;i++){
  128.         data=Get1IndResource('Pref',i);
  129.         if (data!=(Handle)0){
  130.             GetResInfo(data,&junk_id,&junk_type,name);
  131.             SetPrefHandle(name,data);
  132.             ReleaseResource(data);
  133.         }
  134.     }
  135.     
  136.     CheckServerPref("\pArchie");
  137.     CheckServerPref("\pInfoMac");
  138.     CheckServerPref("\pUMich");
  139.     
  140.     SetPrefStr(kICRealName,GetOwnerName(name));
  141. }
  142.  
  143. OSErr CreateScratchFile(FSSpec* protofile){
  144.     OSErr err;
  145.     short count;
  146.     Str255 t;
  147.     
  148.     err=FindFolder(kOnSystemDisk,kTemporaryFolderType,kCreateFolder,&scratch_file.vRefNum,&scratch_file.parID);
  149.     if (err==noErr){
  150.         // scratch_file.parID=2
  151.         count=0;
  152.         
  153.         do {
  154.             SetPString(scratch_file.name,2,"\pInternet Config Temp ",DecStr(count++,t));
  155.             err=HCreate(scratch_file.vRefNum,scratch_file.parID,scratch_file.name,ICcreator,ICfiletype);
  156.         } while (err==dupFNErr);
  157.     }
  158.     
  159.     if (err==noErr){
  160.         if (protofile!=(FSSpec*)0){
  161.             err=CopyFile(protofile,&scratch_file);
  162.             if (err==noErr)
  163.                 err=HRstFLock(scratch_file.vRefNum,scratch_file.parID,scratch_file.name);
  164.         }
  165.     }
  166.     
  167.     if (err==noErr)
  168.         err=ICMapErr(ICSpecifyConfigFile(instance,&scratch_file));
  169.     
  170.     if (protofile==(FSSpec*)0){
  171.         if (err==noErr){
  172.             err=ICMapErr(ICBegin(instance,icReadWritePerm));
  173.             if (err==noErr){
  174.                 AddDefaultPrefs();
  175.                 err=ICMapErr(ICEnd(instance));
  176.             }
  177.         }
  178.     }
  179.     
  180.     return err;
  181. }
  182.  
  183. OSErr DoCloseDoc(void){
  184.     short but;
  185.     OSErr err;
  186.     Str255 ts;
  187.     
  188.     err=WindowsCloseAll();
  189.     if ((err==noErr)&&(IsDocDirty())){
  190.         ParamText(GetDocumentName(ts),"\p","\p","\p");
  191.         InitCursor();
  192.         
  193.         but=CautionAlert(135,gCancelDiscardModalFilter);
  194.         
  195.         switch (but){
  196.             case ok:
  197.                 err=DoSave();
  198.                 break;
  199.             case cancel:
  200.                 err=userCanceledErr;
  201.                 break;
  202.         }
  203.     }
  204.     
  205.     if (err==noErr)
  206.         err=WindowsClose(WindowInfo[WT_Main].window);
  207.     
  208.     if (err==noErr){
  209.         if (scratch_file.name[0]!=0){
  210.             HDelete(scratch_file.vRefNum,scratch_file.parID,scratch_file.name);
  211.             scratch_file.name[0]=0;
  212.         }
  213.     }
  214.     
  215.     return err;
  216. }
  217.  
  218. OSErr DoCloseDocWindow(WindowPtr wp){
  219.     WindowType wt=GetWindowType(wp);
  220.     OSErr err=noErr;
  221.     
  222.     switch (wt){
  223.         case WT_About:
  224.             HideWindow(wp);
  225.             break;
  226.         case WT_Main:
  227.             err=DoCloseDoc();
  228.             break;
  229.         default:
  230.             err=WindowsClose(wp);
  231.             break;
  232.     }
  233.     
  234.     return err;
  235. }
  236.  
  237. OSErr DoNewDoc(void){
  238.     OSErr err;
  239.     Str255 str;
  240.     
  241.     err=DoCloseDoc();
  242.     if (err==noErr){
  243.         WindowsResetPositions();
  244.         new_document=true;
  245.         dirty_document=false;
  246.         locked_document=false;
  247.         
  248.         err=CreateScratchFile((FSSpec*)0);
  249.         
  250.         if (err==noErr)
  251.             WindowsOpen(WT_Main);
  252.         if (err==noErr){
  253.             WindowsSetTitle(WT_Main,GetAString(str,128,1));
  254.             current_file.name[0]=0;
  255.         }
  256.     }
  257.     return err;
  258. }
  259.  
  260. void CurrentSeed(long* seed){
  261.     OSErr err;
  262.     
  263.     *seed=0L;
  264.     if (current_file.name[0]!=0){
  265.         err=ICMapErr(ICSpecifyConfigFile(instance,¤t_file));
  266.         if (err==noErr)
  267.             err=ICMapErr(ICGetSeed(instance,seed));
  268.         err=ICMapErr(ICSpecifyConfigFile(instance,&scratch_file));
  269.     }
  270. }
  271.  
  272. Boolean SameSeed(long seed1,long seed2){
  273.     return ((seed1==seed2)||(seed1==0)||(seed2==0));
  274. }
  275.  
  276. OSErr DoOpenDoc(FSSpec* fss){
  277.     OSErr err;
  278.     Str255 ts;
  279.     
  280.     err=DoCloseDoc();
  281.     if (err==noErr){
  282.         new_document=false;
  283.         dirty_document=false;
  284.         locked_document=FileLocked(fss);
  285.         
  286.         err=CreateScratchFile(fss);
  287.         
  288.         if (err==noErr){
  289.             WindowsRestorePositions();
  290.             err=WindowsOpen(WT_Main);
  291.         }
  292.         if (err==noErr){
  293.             WindowsSetTitle(WT_Main,SetPString(ts,1,fss->name));
  294.             BlockMoveData(fss,¤t_file,sizeof(FSSpec));
  295.         }
  296.         CurrentSeed(¤t_seed);
  297.     }
  298.     return err;
  299. }
  300.  
  301. OSErr DoQuit(void){
  302.     OSErr err;
  303.     
  304.     err=DoCloseDoc();
  305.     if (err==noErr)
  306.         quitnow=true;
  307.     return err;
  308. }
  309.  
  310. OSErr DoSFOpen(void){
  311.     OSErr err;
  312.     FSSpec fss;
  313.     FInfo info;
  314.     
  315.     err=ICStandardGetFile(ICfiletype,&fss,&info);
  316.     if (err==noErr)
  317.         err=DoOpenDoc(&fss);
  318.     
  319.     return err;
  320. }
  321.  
  322. OSErr FindInternetPreferences(FSSpec* default_config){
  323.     OSErr err;
  324.     Boolean isfolder,wasalias;
  325.     
  326.     err=FindFolder(kOnSystemDisk,kPreferencesFolderType,kCreateFolder,&default_config->vRefNum,&default_config->parID);
  327.     if (err==noErr)
  328.         err=ICMapErr(ICDefaultFileName(instance,default_config->name));
  329.     if (err==noErr)
  330.         if (Has_AliasMgr)
  331.             err=ResolveAliasFile(default_config,true,&isfolder,&wasalias);
  332.     
  333.     return err;
  334. }
  335.  
  336. OSErr EditPreference(StringPtr key,FSSpec* fs,Boolean usefss,Boolean usecurrent){
  337.     OSErr err;
  338.     
  339.     if (!usefss){
  340.         if (usecurrent){
  341.             BlockMoveData(¤t_file,fs,sizeof(FSSpec));
  342.             usecurrent=IsDocOpen();
  343.         }
  344.         if (!usecurrent)
  345.             err=FindInternetPreferences(fs);
  346.     }
  347.     if (err==noErr){
  348.         if ((!IsDocOpen())||(fs->vRefNum!=current_file.vRefNum)||(fs->parID!=current_file.parID)||(IUEqualString(fs->name,current_file.name)!=0))
  349.             err=DoOpenDoc(fs);
  350.     }
  351.     if (err==noErr)
  352.         if (key[0]!=0)
  353.             err=EditCurrentPreference(key);
  354.     
  355.     return err;
  356. }
  357.  
  358. OSErr DoOpenInternetPreferences(void){
  359.     FSSpec default_config;
  360.     OSErr err;
  361.     
  362.     // set up the file name
  363.     SetPString(default_config.name,1,kICDefaultFileName);
  364.     
  365.     err=FindInternetPreferences(&default_config);
  366.     if (err==noErr)
  367.         err=DoOpenDoc(&default_config);
  368.     return err;
  369. }
  370.  
  371. OSErr InternalDoSave(FSSpec* fss){
  372.     OSErr err=WindowsFlushAll();
  373.     Str255 ts;
  374.     
  375.     if (err==noErr){
  376.         WindowsSavePositions();
  377.         err=CopyFileSafe(&scratch_file,fss);
  378.     }
  379.     
  380.     if (err==noErr){
  381.         WindowsSetTitle(WT_Main,SetPString(ts,1,fss->name));
  382.         new_document=false;
  383.         dirty_document=false;
  384.         BlockMoveData(fss,¤t_file,sizeof(FSSpec));
  385.     }
  386.     
  387.     CurrentSeed(¤t_seed);
  388.     
  389.     return err;
  390. }
  391.  
  392. OSErr DoSave(void){
  393.     OSErr err;
  394.     long seed;
  395.     short a;
  396.     
  397.     if (current_file.name[0]==0)
  398.         err=DoSaveAs();
  399.     else {
  400.         CurrentSeed(&seed);
  401.         a=ok;
  402.         
  403.         if (!SameSeed(seed,current_seed))
  404.             a=CautionAlert(160,gCancelModalFilter);
  405.         
  406.         if (a==ok)
  407.             err=InternalDoSave(¤t_file);
  408.     }
  409.     
  410.     return err;
  411. }
  412.  
  413. OSErr DoSaveAs(void){
  414.     OSErr err;
  415.     FSSpec fss;
  416.     Str255 ts;
  417.     
  418.     err=ICStandardPutFile("\p",GetDocumentName(ts),&fss);
  419.     if (err==noErr)
  420.         err=InternalDoSave(&fss);
  421.     
  422.     return err;
  423. }
  424.  
  425. OSErr DoOpenApp(void){
  426.     FSSpec default_config;
  427.     OSErr err;
  428.     
  429.     err=FindInternetPreferences(&default_config);
  430.     if (err==noErr)
  431.         err=DoOpenDoc(&default_config);
  432.     if (err==fnfErr){
  433.         err=DoNewDoc();
  434.         if (err==noErr)
  435.             err=InternalDoSave(&default_config);
  436.     }
  437.     return err;
  438. }
  439.  
  440. OSErr InitICDocument(void){
  441.     ICInstance inst;
  442.     OSErr err;
  443.     
  444.     instance=(ICInstance)0;
  445.     current_file.name[0]=0;
  446.     scratch_file.name[0]=0;
  447.     
  448.     /*
  449.         The following function will disable the component interface, forcing the
  450.         application to use the linked-in IC glue.  In the final application, this should
  451.         be removed, but for debugging purposes it ensures that we will be able to
  452.         debug everything the app is doing.
  453.     */
  454.     // ICDisableComponent();
  455.     ICEnableComponent();
  456.     
  457.     err=ICMapErr(ICStart(&inst,ICcreator));
  458.     if (err==noErr)
  459.         instance=inst;
  460.     return err;
  461. }
  462.  
  463. void TermICDocument(void){
  464.     if (instance!=(ICInstance)0)
  465.         ICStop(instance);
  466. }
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.